package dataBase

import (
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
	"log"
)

// StudentInfo 创建学生结构体
type StudentInfo struct {
	ID            string `json:"id"`
	Name          string `json:"name"`
	Sex           string `json:"sex"`
	Age           string `json:"age"`
	Class         string `json:"class"`
	MasterTeacher string `json:"teacher"`
	PhoneNumber   string `json:"phone"`
	Adders        string `json:"adders"`
	InSchool      bool   `json:"inSchool"`
}

// 数据库不存在则创建
var db, err = gorm.Open(sqlite.Open("MySchool.db"), &gorm.Config{})

func DbOpenErr(dbErr error) {
	if dbErr != nil {
		panic(dbErr)
	}
}

// 1.创建数据库
func Init() {
	DbOpenErr(err)
	// 根据结构体自动创建关系型数据表
	_ = db.AutoMigrate(&StudentInfo{})
	log.Println("数据库打开成功")
}

// 2.插入数据
func CreateStuData(stuInfo StudentInfo) error {
	DbOpenErr(err)
	// 传入数据时应该以指针进行传入-->GORM会自动将结构体映射为SQL INSERT语句
	result := db.Create(&stuInfo)
	return result.Error
}

// 3.获取所有数据
func GetAllStuInfo() ([]StudentInfo, error) {
	DbOpenErr(err)
	var stuList []StudentInfo
	result := db.Find(&stuList) // 效果类似：SELECT * FROM stuList;
	return stuList, result.Error
}

// 4.更新数据
func UpdateStuInfo(stuInfo StudentInfo) error {
	/*
		GORM的更新机制：
		GORM会根据主键值判断是更新还是插入
		如果主键为零值(0, "", false等)，GORM会执行插入操作
		如果主键有值但不存在于数据库中，GORM也会执行插入操作
	*/
	DbOpenErr(err)
	// Save方法将更新值保存在数据库中。如果 value 不包含匹配的主键，则插入 value。
	result := db.Save(&stuInfo)
	return result.Error
}

// 5.删除数据
func DeleteStuInfo(id string) error {
	DbOpenErr(err)
	// 使用条件删除
	result := db.Delete(&StudentInfo{}, "id = ?", id)
	return result.Error
}
